
const parser = require('../parser');
const traverse = require('../traverse');
const generate = require('../generator');
const template = require('../template');
// 集成 parse、traverse、generate 3步
function transformSync(code, options) {
    // 1.
    const ast = parser.parse(code, options.parserOpts);
    // visitor 就是插件里面 visitor 的合并
    const pluginApi = {
        template
    }
    const visitors = {};
    // 调用 options 里面的 plugin，传入 options、api，然后把返回的 visitor 合并，之后传入 traverse。
    options.plugins && options.plugins.forEach(([plugin, options]) => {
        const res = plugin(pluginApi, options);
        Object.assign(visitors, res.visitor);
    })

    options.presets && options.presets.reverse().forEach(([preset, options]) => {
        const plugins = preset(pluginApi, options);
        plugins.forEach(([plugin, options]) => {
            const res = plugin(pluginApi, options);
            Object.assign(visitors, res.visitor);
        })
    })

    // 2.
    traverse(ast, visitors);

    // 3.
    return generate(ast, code, options.fileName);
}

module.exports = {
    transformSync
}